package com.bw.lib_common.base

import android.app.Application
import android.util.Log
import com.alibaba.android.arouter.BuildConfig
import com.alibaba.android.arouter.launcher.ARouter
import com.bw.lib_common.utils.AppHolder
import com.bw.lib_common.utils.GenerateTestUserSig
import com.bw.lib_log.crash.CrashHandler
import com.bw.lib_storage.UserMMKV
import com.bw.lib_storage.db.DBUtils
import com.tencent.bugly.crashreport.CrashReport
import com.tencent.imsdk.v2.V2TIMManager
import com.tencent.imsdk.v2.V2TIMSDKConfig
import com.tencent.imsdk.v2.V2TIMSDKListener
import com.tencent.live2.V2TXLivePremier
import com.tencent.mmkv.MMKV
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors

/**
 * 所有application的基类，instance全局上下文
 */
open class BaseApplication:Application(){
    companion object{
        lateinit var instance: BaseApplication
    }
    override fun onCreate() {
        super.onCreate()
        instance = this
        initARouter()
        initMMKV()
        //启动优化
        //线程池
        val executorService: ExecutorService = Executors.newCachedThreadPool()
        executorService.submit {
            initCrash()
            initBugLy()
            initRoom()
            initAppHolder()
        }
        //初始化IM模块
        initIMKit()
        //初始化腾讯云直播SDK
        initTXCloud()
        //18630704579
//        UserMMKV.token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIxODYzMDcwNDU3OSIsImV4cCI6MTc2MTgxMTQyNX0.UA2ybgIoQ6k2oF0d36iApKh-dvCVu7eVKVTJLB2TtrQ"
//        UserMMKV.userId = "18630704579"
    //        //ytx11
//        UserMMKV.token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJ5dHgxMSIsImV4cCI6MTc2MTYzNzAxN30.vRRaYcspYFMM9orCwKLVJaoV62-BkbLoMwESltnw9A4"
//        //ytx22
        UserMMKV.token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJ5dHgyMiIsImV4cCI6MTc2MTgxMTg5N30.KgNjKinHKxXovzxlQtTXP0h0BN9KO7juYQX5aS7mxZ0"
        UserMMKV.userId = "ytx22"
        UserMMKV.userSign = GenerateTestUserSig.genTestUserSig(UserMMKV.userId)
    }

    private fun initTXCloud() {
        val licenceURL = "https://1384285325.trtcube-license.cn/license/v2/1384285325_1/v_cube.license" // 获取到的 licence url
        val licenceKey = "af90397d5551a3477740bae12d3bd25f" // 获取到的 licence key
        V2TXLivePremier.setLicence(this, licenceURL, licenceKey)
        V2TXLivePremier.setObserver(object : V2TXLivePremier.V2TXLivePremierObserver() {
            override fun onLicenceLoaded(result: Int, reason: String?) {
                super.onLicenceLoaded(result, reason)
                Log.d("App", "onLicenceLoaded: $reason $result ")
            }
        })
    }
    private val listener =  object : V2TIMSDKListener() {
        override fun onConnectSuccess() {
            super.onConnectSuccess()
            Log.d("", "im初始化成功: ")
        }
        override fun onConnectFailed(code: Int, error: String?) {
            super.onConnectFailed(code, error)
            Log.d("", "im初始化失败: $code $error")
        }
        //在线发现票据过期
        override fun onUserSigExpired() {
            super.onUserSigExpired()
            Log.d("TAG", "票据过期了: ")
            //和服务器要新的userSign，重新登录
        }
        //在线被人踢掉
        override fun onKickedOffline() {
            super.onKickedOffline()
            Log.d("TAG", "被人踢掉了，提示用户是否重新登录: ")
            //和服务器要新的userSign，重新登录
        }

    }

    private fun initIMKit() {


        // 1. 从即时通信 IM 控制台获取应用 SDKAppID。
// 2. 初始化 config 对象。
        val config: V2TIMSDKConfig = V2TIMSDKConfig()

// 3. 指定 log 输出级别。
        config.setLogLevel(V2TIMSDKConfig.V2TIM_LOG_INFO)
// 4. 添加 V2TIMSDKListener 的事件监听器，sdkListener 是 V2TIMSDKListener 的实现类，如果您不需要监听 IM SDK 的事件，这个步骤可以忽略。
        V2TIMManager.getInstance().addIMSDKListener(listener)

// 5. 初始化 IM SDK，调用这个接口后，可以立即调用登录接口。
        V2TIMManager.getInstance().initSDK(this, 1600111231, config)

    }

    private fun initAppHolder() {
        AppHolder.getInstance().initialize(this)
    }

    private fun initRoom() {
        //初始化数据据库
        DBUtils.init(this,"club.db")
    }

    fun initMMKV(){
        //mmkv初始化
        MMKV.initialize(this)
    }

    fun initARouter(){
        // 这两行必须写在 init 之前，否则这些配置在 init 过程中将无效
        if (BuildConfig.DEBUG) {
            // 打印日志，方便调试，不要在 Release 模式开启
            ARouter.openLog()
            // 开启调试模式（如果在 InstantRun 模式下运行，必须开启调试模式！）
            ARouter.openDebug()
        }
        // 初始化 ARouter
        ARouter.init(this)
    }
    fun initCrash(){
        //Crash初始化
        CrashHandler.init(this)
    }
    fun initBugLy(){
        //bugly异常崩溃上报
        CrashReport.initCrashReport(this, "3f8b5a9db7", false) //true调试模式  false发布模式
    }

    override fun onTerminate() {
        // 移除 V2TIMSDKListener 的事件监听器，sdkListener 是 V2TIMSDKListener 的实现类
        V2TIMManager.getInstance().removeIMSDKListener(listener)
// 反初始化 SDK
        V2TIMManager.getInstance().unInitSDK()
        super.onTerminate()
    }
}